// self.importScripts('spark-md5')
// self.importScripts(['spark-md5'])
import SparkMD5 from 'spark-md5'

/**
 * 监听从主线程发送过来的消息，并计算消息中文件的MD5值。
 * @param e 事件对象，包含从主线程发送过来的数据。
 */
self.onmessage = (e) => {
    const chunks = e.data // 收到的数据块
    console.log('fileHash', chunks, e)
    const md5 = new SparkMD5.ArrayBuffer() // 创建MD5计算实例

    /**
     * 递归函数，用于将文件数据块逐个读取并附加到MD5计算中。
     * @param index 当前处理的数据块索引，默认为0。
     */
    const appendToChunk = (index = 0) => {
        const reader = new FileReader() // 创建文件读取实例
        reader.readAsArrayBuffer(chunks[index].file) // 读取当前索引的数据块文件
        reader.onload = (e: ProgressEvent<FileReader>) => {
            md5.append(e.target?.result as ArrayBuffer) // 将读取到的数据附加到MD5计算中
            if (++index < chunks.length)
                appendToChunk(index) // 如果还有数据块，则继续处理
            else self.postMessage({ msg: 'success', result: md5.end() }) // 所有数据块处理完毕，发送MD5结果给主线程
        }
        reader.onerror = () => {
            self.postMessage({ msg: 'fail' }) // 文件读取失败，通知主线程
        }
    }
    appendToChunk() // 开始处理数据块
}
